package errors

import "fmt"

// ErrorType 定义错误类型
type ErrorType int

const (
    // ErrTypeNone 无错误
    ErrTypeNone ErrorType = iota
    // ErrTypeIO IO错误
    ErrTypeIO
    // ErrTypeParam 参数错误
    ErrTypeParam
    // ErrTypeResource 资源错误
    ErrTypeResource
    // ErrTypeRuntime 运行时错误
    ErrTypeRuntime
)

// Error 自定义错误结构
type Error struct {
    Type    ErrorType
    Code    int
    Message string
    Err     error
}

func (e *Error) Error() string {
    if e.Err != nil {
        return fmt.Sprintf("[%d] %s: %v", e.Code, e.Message, e.Err)
    }
    return fmt.Sprintf("[%d] %s", e.Code, e.Message)
}

// New 创建新错误
func New(errType ErrorType, code int, message string) *Error {
    return &Error{
        Type:    errType,
        Code:    code,
        Message: message,
    }
}

// Wrap 包装已有错误
func Wrap(err error, errType ErrorType, code int, message string) *Error {
    return &Error{
        Type:    errType,
        Code:    code,
        Message: message,
        Err:     err,
    }
}
